//package com.dataseek.iot.device.mqtt;
//
//import com.alibaba.fastjson.JSON;
//import com.alibaba.fastjson.JSONObject;
//import com.dataseek.iot.device.entity.DeviceAttrValue;
//import com.dataseek.iot.device.entity.DeviceAttrValueHis;
//import com.dataseek.iot.device.entity.MqttLog;
//import com.dataseek.iot.device.mapper.DeviceAttValueHisMapper;
//import com.dataseek.iot.device.service.DeviceAttValueService;
//import com.dataseek.iot.device.service.MqttLogService;
//import com.dataseek.iot.device.service.NotifyRuleService;
//import com.dataseek.iot.toolikit.common.service.IDServiceHelper;
//import com.dataseek.iot.toolikit.common.util.DateUtils;
//import lombok.extern.slf4j.Slf4j;
//import org.eclipse.paho.client.mqttv3.IMqttDeliveryToken;
//import org.eclipse.paho.client.mqttv3.MqttCallback;
//import org.eclipse.paho.client.mqttv3.MqttException;
//import org.eclipse.paho.client.mqttv3.MqttMessage;
//import org.springframework.beans.factory.annotation.Autowired;
//import org.springframework.stereotype.Component;
//import org.springframework.util.CollectionUtils;
//
//import java.util.HashMap;
//import java.util.List;
//import java.util.Map;
//
///**
// * ClassName:PubCallBack
// * Describe:
// * Author:DGJ
// * Data:2020/10/29 10:48
// */
//@Slf4j
//@Component
//public class NewCallBackSys implements MqttCallback {
//
//    private MqttSubSys mqttSub;
//
//    @Autowired
//    private MqttLogService mqttLogService;
//
//    @Autowired
//    private IDServiceHelper idServiceHelper;
//
//    @Autowired
//    private DeviceAttValueService deviceAttValueService;
//
//    @Autowired
//    private NotifyRuleService notifyRuleService;
//
//    private static NotifyRuleService notifyRuleServiceStatic;
//    private static MqttLogService mqttLogServiceStatic;
//    private static IDServiceHelper idServiceHelperStatic;
//    private static DeviceAttValueService deviceAttValueServiceStatic;
//
//    public NewCallBackSys() throws MqttException {
//    }
//
//    @Override
//    public void connectionLost(Throwable cause) {
//        // 连接丢失后，一般在这里面进行重连
//        while (true){
//            try {
//                //如果没有发生异常说明连接成功，如果发生异常，则死循环
//                Thread.sleep(1000);
//                mqttSub.init();
//                break;
//            }catch (Exception e){
////                e.printStackTrace();
//            }
//        }
//    }
//
//    @Override
//    public void deliveryComplete(IMqttDeliveryToken token) {
//        System.out.println("deliveryComplete---------" + token.isComplete());
//    }
//
//    @Override
//    public void messageArrived(String topic, MqttMessage message) throws Exception {
//        // subscribe后得到的消息会执行到这里面
//        String result = new String(message.getPayload(),"UTF-8");
////        System.out.println("接收消息主题 : " + topic);
////        System.out.println("接收消息Qos : " + message.getQos());
////        System.out.println("接收消息内容 : " + result);
//        //这里可以针对收到的消息做处理
//        //解析返回的信息
//        String[] topicParams = topic.split("/");
//        if(topicParams.length==1){
//            log.info(result);
//        }
//        String deviceId;
////        if(topic.contains(OFFLINE)||topic.contains(ONLINE)){
////            log.error("设备"+ topicParams[0] + data);
////            return;
////        }
////
////        if(topic.contains(SYSDESCR)){
////            return;
////        }
//        //解析result
//        JSONObject jsonData = JSON.parseObject(result);
//        String messageId=jsonData.get("messageId").toString();
//        long timestamp=Long.parseLong(jsonData.get("timestamp").toString());
////        String properties=jsonData.get("properties").toString();
////        Map proJson=JSON.parseObject(properties,Map.class);
//
//
//        //首先先记录日志
//        MqttLog mqttLog=new MqttLog();
//        //保存发送日志
//        long id = idServiceHelperStatic.nextId();
//        mqttLog.setMqttLogId(id);
//        mqttLog.setTopic(topic);
//        mqttLog.setMessage(result);
//        mqttLog.setMessageId(messageId);
//        mqttLog.setTimestamp(timestamp);
//        mqttLog.setSendTime(DateUtils.getDateTimeNowStr());
//        mqttLogServiceStatic.insertAction(mqttLog);
//        //解析各个topic
//        deviceId=topicParams[2];
//        //查询获取该设备属性
//        List<DeviceAttrValue> deviceAttList= deviceAttValueServiceStatic.queryDeviceAttList(deviceId,null);
//        if (CollectionUtils.isEmpty(deviceAttList)) {
//            log.info("设备{}没有配置属性！", deviceId);
//            return;
//        }
//        if(topic.contains(MqttConstant.REPLY_READ_PROPS)){//设备属性回复
//            String properties=jsonData.get("properties").toString();
//            Map proJson=JSON.parseObject(properties,Map.class);
//            boolean successFlag= Boolean.parseBoolean(jsonData.get("success").toString());
//            if(successFlag) {
//                DeviceAttrValueHis deviceAttrValueHis=new DeviceAttrValueHis();
//                //更新设备属性
//                for (int i = 0; i < deviceAttList.size(); i++) {
//                    DeviceAttrValue deviceAttrValue = deviceAttList.get(i);
//                    String attCode = deviceAttrValue.getAttCode();
//                    //有对应的属性数据就更新
//                    if (proJson.get(attCode) != null) {
//                        String attValue = proJson.get(attCode).toString();
//                        deviceAttrValue.setAttValue(Float.parseFloat(attValue));
//                        deviceAttValueServiceStatic.updateDeviceAtt(deviceAttrValue);
//                        //新增属性历史数据
//                        long hisId = idServiceHelperStatic.nextId();
//                        deviceAttrValueHis.setId(hisId);
//                        deviceAttrValueHis.setPdtCode(deviceAttrValue.getPdtCode());
//                        deviceAttrValueHis.setDeviceCode(deviceAttrValue.getDeviceCode());
//                        deviceAttrValueHis.setAttCode(deviceAttrValue.getAttCode());
//                        deviceAttrValueHis.setAttValue(Float.parseFloat(attValue));
//                        deviceAttrValueHis.setAttName(deviceAttrValue.getAttName());
//                        deviceAttrValueHis.setCreateTime(DateUtils.getDateTimeNowStr());
//                        deviceAttValueServiceStatic.insertDeviceAttHis(deviceAttrValueHis);
//                    }
//                }
//            }else {
//                //读取失败
//            }
//        }else if(topic.contains(MqttConstant.REPORT_PROPS)){//设备属性上报
//            String properties=jsonData.get("properties").toString();
//            Map proJson=JSON.parseObject(properties,Map.class);
//            //更新设备属性
//            for(int i=0;i<deviceAttList.size();i++){
//                DeviceAttrValue deviceAttrValue= deviceAttList.get(i);
//                String attCode= deviceAttrValue.getAttCode();
//                //有对应的属性数据就更新
//                if(proJson.get(attCode)!=null){
//                    String attValue=proJson.get(attCode).toString();
//                    deviceAttrValue.setAttValue(Float.parseFloat(attValue));
//                    deviceAttValueServiceStatic.updateDeviceAtt(deviceAttrValue);
//                }
//            }
//        }else if(topic.contains(MqttConstant.EVENT)){//设备事件上报,告警信息上报/{productId}/{deviceId}/event/{eventId}
//            String eventId=topicParams[4];//获取事件id
////            //当前液位值
////            DeviceAttrValue curLevelValue = deviceAttList.stream().filter(d->"liquidLevel".equals(d.getAttCode())).findFirst().orElse(null);
////            if (curLevelValue != null) {
////            }
////            else {
////                log.info("设备{}没有获取到当前液位属性值", deviceId);
////                return;
////            }
//            this.sendAlarmMsg(deviceId, result);
//        }else if(topic.contains(MqttConstant.REPLY_WRITE_PROPS)){//调用设备功能修改回复
//            String properties=jsonData.get("properties").toString();
//            Map proJson=JSON.parseObject(properties,Map.class);
//            boolean successFlag= Boolean.parseBoolean(jsonData.get("success").toString());
//            if(successFlag) {
//                //需要调用invoke ,将数据保存在设备中，不然设备断电后属性会丢失
//            }else{
//                //失败需要再次调用
//            }
//        }else if(topic.contains(MqttConstant.REPLY_INVOKE_FUNCTION)){//调用通讯协议回复
//
//        }
//    }
//
//    //处理
//
//    //告警通知处理
//    private void sendAlarmMsg(String deviceCode, String result) {
//        //从消息里获取告警值
//        JSONObject dataJson = JSONObject.parseObject(result).getJSONObject("data");
//        String type = dataJson.getString("type");
//        String value = dataJson.getString("value");
//        //报警类型(A：高限报警 B：高高限报警 C：低限报警 D: 低低限报警)
//        String alarmType = "";
//        switch (type) {
//            case "highHigh":
//                alarmType = "B";
//                break;
//            case "high":
//                alarmType = "A";
//                break;
//            case "low":
//                alarmType = "C";
//                break;
//            case "lowLow":
//                alarmType = "D";
//                break;
//            default:
//        }
//
//        Map<String, String> paramMap = new HashMap<>();
//        paramMap.put("deviceCode", deviceCode);
//        paramMap.put("liquidLevel", value);
//        //test,发送高限报警通知,A匹配的是高限报警
//        notifyRuleServiceStatic.sendNotifyMsg(alarmType, paramMap);
//    }
//}
